#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#include <unistd.h>

#define MSGTYPE 1
#define MSGTYPE2 2
struct msgbuf {
    long mtype;
    char mtext[100];
};

int main() {
    key_t key;
    int msgid;

    key = ftok("/tmp/example", 'R');
    msgid = msgget(key, 0666 | IPC_CREAT);

    if (msgid == -1) {
        perror("msgget");
        exit(1);
    }

    while(1){
        // 1.接受相同的 msgtype
        struct msgbuf rcv;
        if (msgrcv(msgid, &rcv, sizeof(rcv.mtext), MSGTYPE, IPC_NOWAIT) != -1) {
            printf("++++++ Received msgtype=1: %s\n", rcv.mtext);
        }
        
        // 2.接受不同的 msgtype
        struct msgbuf rcv2;
        if (msgrcv(msgid, &rcv2, sizeof(rcv2.mtext), MSGTYPE2, IPC_NOWAIT) != -1) {
            printf("------- Received msgtype=2: %s\n", rcv.mtext);
        }
        
        sleep(2);
    }

    return 0;
}
